/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.beans;

import co.com.claro.administracionSolicitudes.dao.exceptions.ClaroException;
import co.com.claro.administracionSolicitudes.db.EJBDatabaseSolicitudesLocal;
import co.com.claro.administracionSolicitudes.entity.Gerencia;
import co.com.claro.administracionSolicitudes.entity.TipoCompania;
import co.com.claro.administracionSolicitudes.entity.enums.EstadoActividadEnum;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

/**
 *
 * @author Mike
 */
@ManagedBean
@ViewScoped
public class CrearGerenciaBean {

    @EJB
    private EJBDatabaseSolicitudesLocal localDatabase;
    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean sesionBean;
    /**
     * Lista con las compañías internas
     */
    private List<SelectItem> companiasInternasItems;
    /**
     * Lista con las coordinaciones disponibles
     */
    private List<Gerencia> gerencias;
    /**
     * Nombre de la gerencia
     */
    private String nombreGerencia;
    /**
     * Compañía interna que selecciona el usuario
     */
    private String companiaInternaSelect;
    /**
     * Gerencia del datatable seleccionada por el usuario
     */
    private Gerencia gerenciaSeleccionada;
    /**
     * Usuario gerente
     */
    private String usuarioGerente;
    /**
     * Usuario al que se debe escalar la solicitud en caso que el gerente no
     * pueda dar aval a la solicitud
     */
    private String gerenteEscalado;
    /**
     * Variable que contiene el mensaje de error o confirmación de la acción
     * realizada por el usuario
     */
    private String mensaje;

    /**
     * Creates a new instance of CrearGerenciaBean
     */
    public CrearGerenciaBean() {
    }

    @PostConstruct
    public void inicializarValores() {

        llenarCompaniasInternas();

        obtenerGerencias();
    }

    //++++++++++++++++++++++++++++++ MÉTODOS PROPIOS DEL EJB ++++++++++++++++++++
    /**
     * Método que envía el objeto al EJB para que se persista en base de datos
     */
    public void crearGerencia() {
        if (isCamposInvalidos()) {
            return;
        }

        Gerencia gerencia = new Gerencia();

        gerencia.setNombre(nombreGerencia);
        gerencia.setTipoCompania(new TipoCompania(Integer.parseInt(companiaInternaSelect)));
        gerencia.setActivo(EstadoActividadEnum.ACTIVO.getId());
        gerencia.setUsuario(sesionBean.getUsuario().getUsername());
        try {
            localDatabase.crearGerencia(gerencia);
            incluirMensaje(ResourceBundle.getBundle("mensajes").getString("cambiosGuardadosOk"));
        } catch (ClaroException ex) {
            incluirMensaje(ex.getMessage());
        }
        obtenerGerencias();
        borrarCampos();
    }

    /**
     * Método que envía el objeto al EJB para que se persista en base de datos
     */
    public void modificarGerencia(ActionEvent event) {
        if (isCamposInvalidos()) {
            return;
        }

        if (!usuarioGerente.isEmpty()) {
            gerenciaSeleccionada.setUsernameAprobador(usuarioGerente);
        }
        if (!gerenteEscalado.isEmpty()) {
            gerenciaSeleccionada.setUsernameEscalado(gerenteEscalado);
        }
        gerenciaSeleccionada.setNombre(nombreGerencia);
        gerenciaSeleccionada.setTipoCompania(new TipoCompania(Integer.parseInt(companiaInternaSelect)));
        gerenciaSeleccionada.setUsuario(sesionBean.getUsuario().getUsername());
        try {
            localDatabase.modificarGerencia(gerenciaSeleccionada);
            incluirMensaje(ResourceBundle.getBundle("mensajes").getString("cambiosGuardadosOk"));
        } catch (ClaroException ex) {
            incluirMensaje(ex.getMessage());
        }
        obtenerGerencias();
        borrarCampos();
    }

    /**
     * Método que envía el objeto al EJB para que se persista en base de datos
     */
    public void eliminarGerencia(ActionEvent event) {
        gerenciaSeleccionada = obtenerObjeto(event);

        gerenciaSeleccionada.setUsuario(sesionBean.getUsuario().getUsername());
        try {
            localDatabase.borradoLogicoGerencia(gerenciaSeleccionada);
            incluirMensaje(ResourceBundle.getBundle("mensajes").getString("cambiosGuardadosOk"));
        } catch (ClaroException ex) {
            incluirMensaje(ex.getMessage());
        }
        obtenerGerencias();
        borrarCampos();
    }

    /**
     * Método que obtiene las gerencias alamcenadas en la base de datos
     */
    private void obtenerGerencias() {
        gerencias = localDatabase.findGerenciaByEstado(EstadoActividadEnum.ACTIVO.getId());
    }
    
    //++++++++++++++++++++++++++++++ MÉTODOS PROPIOS DEL BEAN ++++++++++++++++++++
    /**
     * Método que llena las compañias internas que maneja la gerencia
     */
    private void llenarCompaniasInternas() {
        List<TipoCompania> tipoCompanias;
        tipoCompanias = localDatabase.findTipoCompaniaByEstado(EstadoActividadEnum.ACTIVO.getId());
        if (companiasInternasItems == null) {
            companiasInternasItems = new ArrayList<SelectItem>();
        }
        for (TipoCompania temporal : tipoCompanias) {
            companiasInternasItems.add(new SelectItem(temporal.getIdTipoCompania(), temporal.getNombre()));
        }
    }

    /**
     * Método que obtiene el id del objeto contenido dentro del data table
     *
     * @param ActionEvent, evento para buscar el objeto dentro del contexto
     * @return Object, con el id del objeto
     */
    private Gerencia obtenerObjeto(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        UIComponent componente = event.getComponent().findComponent("idGerenciaOutputText");
        Short id = (Short) componente.getValueExpression("value").getValue(context.getELContext());
        return gerencias.get(gerencias.indexOf(new Gerencia(id)));
    }

    /**
     * Método que obtiene el objeto seleccionado por el usuario
     *
     * @param event
     */
    public void seleccionarGerencia(ActionEvent event) {
        gerenciaSeleccionada = obtenerObjeto(event);

        nombreGerencia = gerenciaSeleccionada.getNombre();
        usuarioGerente = gerenciaSeleccionada.getUsernameAprobador();
        gerenteEscalado = gerenciaSeleccionada.getUsernameEscalado();
        companiaInternaSelect = gerenciaSeleccionada.getTipoCompania().getIdTipoCompania().toString();
    }

    /**
     * Método que toma un mensaje enviado y lo pasa al contexto para que sea
     * mostrado en la interfaz gráfica del usuario
     *
     * @param String, mensaje con el error que se desea mostrar.
     */
    private void incluirMensaje(String error) {
//        FacesContext.getCurrentInstance().addMessage(null, 
//            new FacesMessage(FacesMessage.SEVERITY_INFO, error, null));
        mensaje = error;
    }

    /**
     * Método que valida todos los campos, incluye el mensaje de error en el
     * contexto y retorna una respuesta dependiendo de los que encuentre en las
     * validaciones
     *
     * @return boolean, indicando si los campos del formulario son correctos o
     * no
     */
    private boolean isCamposInvalidos() {
        if (nombreGerencia == null || nombreGerencia.isEmpty()) {
            String error = ResourceBundle.getBundle("errores").getString("errorNombreGerencia");
            incluirMensaje(error);
            return true;
        }
        if (companiaInternaSelect == null || companiaInternaSelect.isEmpty()) {
            String error = ResourceBundle.getBundle("errores").getString("errorCompaniaInterna");
            incluirMensaje(error);
            return true;
        }
        return false;
    }

    /**
     * Método que borra los campos cuando se han hecho modificaciones
     */
    private void borrarCampos() {
        nombreGerencia = null;
        gerenteEscalado = null;
        companiaInternaSelect = null;
        gerenciaSeleccionada = null;
        usuarioGerente = null;
    }

    //*********************************** GETTERS Y SETTERS *******************************
    public List<SelectItem> getCompaniasInternasItems() {
        return companiasInternasItems;
    }

    public void setCompaniasInternasItems(List<SelectItem> companiasInternasItems) {
        this.companiasInternasItems = companiasInternasItems;
    }

    public List<Gerencia> getGerencias() {
        return gerencias;
    }

    public void setGerencias(List<Gerencia> gerencias) {
        this.gerencias = gerencias;
    }

    public String getNombreGerencia() {
        return nombreGerencia;
    }

    public void setNombreGerencia(String nombreGerencia) {
        this.nombreGerencia = nombreGerencia;
    }

    public String getCompaniaInternaSelect() {
        return companiaInternaSelect;
    }

    public void setCompaniaInternaSelect(String companiaInternaSelect) {
        this.companiaInternaSelect = companiaInternaSelect;
    }

    public String getUsuarioGerente() {
        return usuarioGerente;
    }

    public void setUsuarioGerente(String usuarioGerente) {
        this.usuarioGerente = usuarioGerente;
    }

    public UsuarioSessionBean getSesionBean() {
        return sesionBean;
    }

    public void setSesionBean(UsuarioSessionBean sesionBean) {
        this.sesionBean = sesionBean;
    }

    public String getGerenteEscalado() {
        return gerenteEscalado;
    }

    public void setGerenteEscalado(String gerenteEscalado) {
        this.gerenteEscalado = gerenteEscalado;
    }

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

}
